/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Usuario;

import Geral.ErroInternoException;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

/**
 *
 * @author Ivaldo
 */
@Stateless
public class RepositorioUsuarioJPA implements IRepositorioUsuario, Serializable{
    
    @PersistenceContext
    private EntityManager em;
    
    public RepositorioUsuarioJPA(){
        this.em = Persistence.createEntityManagerFactory("HelpFitPU").createEntityManager();
    }

    @Override
    public void adicionar(Usuario usuario) throws ErroInternoException, UsuarioExistenteException {
        try{
            this.em.persist(usuario);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public void remover(long id_usuario) throws ErroInternoException, UsuarioInexistenteException {
        Usuario u = this.buscarUsuario(id_usuario);
        try{
            this.em.remove(u);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public Usuario buscarUsuario(long id_usuario) throws ErroInternoException, UsuarioInexistenteException {
        try{
            Usuario u = this.em.find(Usuario.class, id_usuario);
            if(u == null){
                throw new UsuarioInexistenteException();
            }return u;
        }catch(UsuarioInexistenteException e){
            throw e;
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public Usuario buscarUsuarioPorNome(String nome_usuario) throws ErroInternoException, UsuarioInexistenteException {
        try{
            TypedQuery <Usuario> u = this.em.createQuery("SELECT u FROM Usuario u WHERE u.nome LIKE :nome", Usuario.class);
            u.setParameter("nome", nome_usuario);
            return u.getSingleResult();
        }catch(NoResultException e){
            throw new UsuarioInexistenteException();
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public void atualizar(Usuario usuario) throws ErroInternoException, UsuarioInexistenteException {
        this.buscarUsuario(usuario.getId());
        try{
            this.em.merge(usuario);
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public Usuario loginUsuario(String login, String senha) throws ErroInternoException, UsuarioInexistenteException {
        try{
            TypedQuery<Usuario> query = this.em.createQuery("SELECT u FROM Usuario u WHERE u.login = :login AND u.senha = :senha", Usuario.class);
            query.setParameter("login", login);
            query.setParameter("senha", senha);
            return query.getSingleResult();
        }catch(NoResultException e){
            throw new UsuarioInexistenteException();
        }catch(Exception e){
            throw new ErroInternoException(e);
        }
    }

    @Override
    public List<Usuario> listaUsuario(Usuario usuario) throws ErroInternoException {
        TypedQuery <Usuario> listaUsuarios = this.em.createQuery("SELECT u FROM Usuario u", Usuario.class);
        return listaUsuarios.getResultList();
    }
}
